package com.example.word.util;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.example.word.dto.TemplateDTO;
import com.example.word.pojo.Template;
import com.spire.doc.Document;
import com.spire.doc.DocumentObject;
import com.spire.doc.Section;
import com.spire.doc.Table;
import com.spire.doc.documents.DocumentObjectType;
import com.spire.doc.documents.Paragraph;
import com.spire.doc.documents.TextSelection;
import com.spire.doc.fields.DocPicture;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.concurrent.CountDownLatch;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.atomic.AtomicInteger;

import static com.example.word.constant.CommonConst.*;

/**
 * 获取文档属性的工具类
 *
 * @author yuwen
 * @date 2023/4/5
 */

public class AttributesUtils {


    //
    public static TemplateDTO getAttributes(String path) {
        Document doc = new Document();
        doc.loadFromFile(path);

        TemplateDTO templateDTO = new TemplateDTO();
        //遍历section
        for (int i = 0; i < doc.getSections().getCount(); i++)
        {

            if(doc.getSections().getCount() > 1 && i == 0){
                i = 1;
            }
            Section section = doc.getSections().get(i);
            //页边距
            if (templateDTO.getPageMarginT() == null && templateDTO.getPageMarginB() == null ) {
                //顶部页边距
                double top = section.getPageSetup().getMargins().getTop();
                //底部页边距
                double bottom = section.getPageSetup().getMargins().getBottom();
                templateDTO.setPageMarginT(top);
                templateDTO.setPageMarginB(bottom);
            }

            int count = section.getTables().getCount();
            if(count != 0){
                Table table = section.getTables().get(0);
                if(templateDTO.getHorizontalAlignTable() == null){
                    int align = table.getTableFormat().getHorizontalAlignment().getValue();
                    templateDTO.setHorizontalAlignTable(align);
                }
            }

            //遍历Paragraph
            for (int j = 0; j < section.getParagraphs().getCount(); j++)
            {
                Paragraph paragraph = section.getParagraphs().get(j);
                for (int m = 0; m < paragraph.getChildObjects().getCount() && templateDTO.getAlignImage() == null; m++) {
                    DocumentObject docobj = paragraph.getChildObjects().get(m);
                    if (docobj.getDocumentObjectType()== DocumentObjectType.Picture)
                    {
                        DocPicture picture = (DocPicture) docobj ;
                        Paragraph image_p = picture.getOwnerParagraph();
                        int align = image_p.getFormat().getHorizontalAlignment().getValue();
                        String text = section.getParagraphs().get(j + 1).getText();
                        if(StringUtils.isBlank(text) || text.equals(" ")){
                            continue;
                        }
                        int alignT = section.getParagraphs().get(j + 1).getFormat().getHorizontalAlignment().getValue();
                        TextSelection textSelection = doc.findString(section.getParagraphs().get(j + 1),text, false, false);
                        String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                        float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                        templateDTO.setAlignImage(align);
                        templateDTO.setImageTSize(fontSize);
                        templateDTO.setImageTName(fontName);
                        templateDTO.setAlignImageT(alignT);
                    }
                }

                if(paragraph.getText().equals(" ") || paragraph.getText() == null || paragraph.getText().isEmpty()) continue;

                //从当前段落位置向下寻找字符串
                TextSelection textSelection = doc.findString(section.getParagraphs().get(j),paragraph.getText(), false, true);
                //获取标题
                //if ( (paragraph.getStyleName().matches("标题1")|| paragraph.getStyleName().matches("Heading1")) && templateDTO.getAlignHFirst() == null)//段落为“标题1”的内容
                if (paragraph.getFormat().getOutlineLevel().getValue() == 0 && templateDTO.getAlignHFirst() == null)//段落为“标题1”的内容
                {

                    //左对齐0 居中 1 右对齐 2  两端对齐 3 对齐方式
                    int align = paragraph.getFormat().getHorizontalAlignment().getValue();
                    //一级标题字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //一级标题字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    templateDTO.setAlignHFirst(align);
                    templateDTO.setSizeHFirst(fontSize);
                    templateDTO.setNameHFirst(fontName);
                    continue;
                }
                //获取标题
                if ( paragraph.getFormat().getOutlineLevel().getValue() == 1 && templateDTO.getAlignHSecond() == null)//段落为“标题2”的内容
                {
                    //左对齐3 居中 1 右对齐 2 对齐方式
                    int align = paragraph.getFormat().getHorizontalAlignment().getValue();
                    //二级标题字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //二级标题字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    templateDTO.setAlignHSecond(align);
                    templateDTO.setSizeHSecond(fontSize);
                    templateDTO.setNameHSecond(fontName);
                    continue;
                }
                //获取标题
                if ( paragraph.getFormat().getOutlineLevel().getValue() == 2 && templateDTO.getAlignHThird() == null)//段落为“标题3”的内容
                {
                    //左对齐3 居中 1 右对齐 2 对齐方式
                    int align = paragraph.getFormat().getHorizontalAlignment().getValue();
                    //三级标题字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //三级标题字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    templateDTO.setAlignHThird(align);
                    templateDTO.setSizeHThird(fontSize);
                    templateDTO.setNameHThird(fontName);
                    continue;
                }
                //获取标题
                if ( paragraph.getFormat().getOutlineLevel().getValue() == 3 && templateDTO.getAlignHFourth() == null)//段落为“标题4”的内容
                {
                    //左对齐3 居中 1 右对齐 2 对齐方式
                    int align = paragraph.getFormat().getHorizontalAlignment().getValue();
                    //四级标题字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //四级标题字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    templateDTO.setAlignHFourth(align);
                    templateDTO.setSizeHFourth(fontSize);
                    templateDTO.setNameHFourth(fontName);
                    continue;
                }

                if ( paragraph.getFormat().getOutlineLevel().getValue() == 9 && templateDTO.getNameText() == null)//正文内容
                {
                    float lineSpacing = paragraph.getFormat().getLineSpacing();
                    //首行缩进大小
                    float firstLineIndent = paragraph.getFormat().getFirstLineIndent();
                    templateDTO.setLineSpacing(lineSpacing);
                    templateDTO.setIndent(firstLineIndent);
                    //正文字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //正文字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    templateDTO.setNameText(fontName);
                    templateDTO.setSizeText(fontSize);
                    continue;
                }
                //列表内容
                if(paragraph.getStyleName().matches("ListParagraph") && templateDTO.getNameList() == null){
                    //列表字体名称
                    String fontName = textSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
                    //列表字体大小
                    float fontSize = textSelection.getAsOneRange().getCharacterFormat().getFontSize();
                    templateDTO.setNameList(fontName);
                    templateDTO.setSizeList(fontSize);

                }

            }

        }
        return templateDTO;
    }




//    public static TemplateDTO getAttributes(String path) {
//        Document doc = new Document();
//        doc.loadFromFile(path);
//
//        TemplateDTO templateDTO = new TemplateDTO();
//        int sectionCount = doc.getSections().getCount();
//        ExecutorService executorService = Executors.newCachedThreadPool();
//        for (int i = 0; i < sectionCount; i++) {
//            if (doc.getSections().getCount() > 1 && i == 0) {
//                i = 1;
//            }
//            Section section = doc.getSections().get(i);
//            double topMargin = section.getPageSetup().getMargins().getTop();
//            double bottomMargin = section.getPageSetup().getMargins().getBottom();
//            if (templateDTO.getPageMarginT() == null && templateDTO.getPageMarginB() == null) {
//                templateDTO.setPageMarginT(topMargin);
//                templateDTO.setPageMarginB(bottomMargin);
//            }
//            int tableCount = section.getTables().getCount();
//            if (tableCount != 0) {
//                Table table = section.getTables().get(0);
//                if (templateDTO.getHorizontalAlignTable() == null) {
//                    int align = table.getTableFormat().getHorizontalAlignment().getValue();
//                    templateDTO.setHorizontalAlignTable(align);
//                }
//            }
//            int paragraphCount = section.getParagraphs().getCount();
//
//            int j = 0;
//            while (j < paragraphCount) {
//                Paragraph paragraph = section.getParagraphs().get(j);
//                if (paragraph.getText().isEmpty()) {
//                    j++;
//                    continue;
//                }
//                TextSelection selection = doc.findString(paragraph, paragraph.getText(), false, true);
//                float fontSize = selection.getAsOneRange().getCharacterFormat().getFontSize();
//                String fontName = selection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
//                switch (paragraph.getFormat().getOutlineLevel().getValue()) {
//                    case TITLE_FIRST:
//                        if (templateDTO.getAlignHFirst() == null) {
//                            int align1 = paragraph.getFormat().getHorizontalAlignment().getValue();
//                            templateDTO.setAlignHFirst(align1);
//                            templateDTO.setSizeHFirst(fontSize);
//                            templateDTO.setNameHFirst(fontName);
//                        }
//                        break;
//                    case TITLE_SECOND:
//                        if (templateDTO.getAlignHSecond() == null) {
//                            int align2 = paragraph.getFormat().getHorizontalAlignment().getValue();
//                            templateDTO.setAlignHSecond(align2);
//                            templateDTO.setSizeHSecond(fontSize);
//                            templateDTO.setNameHSecond(fontName);
//                        }
//                        break;
//                    case TITLE_THIRD:
//                        if (templateDTO.getAlignHThird() == null) {
//                            int align3 = paragraph.getFormat().getHorizontalAlignment().getValue();
//                            templateDTO.setAlignHThird(align3);
//                            templateDTO.setSizeHThird(fontSize);
//                            templateDTO.setNameHThird(fontName);
//                        }
//                        break;
//                    case TITLE_FOURTH:
//                        if (templateDTO.getAlignHFourth() == null) {
//                            int align4 = paragraph.getFormat().getHorizontalAlignment().getValue();
//                            templateDTO.setAlignHFourth(align4);
//                            templateDTO.setSizeHFourth(fontSize);
//                            templateDTO.setNameHFourth(fontName);
//                        }
//                        break;
//                    case TEXT:
//                        if (templateDTO.getNameText() == null) {
//                            float lineSpacing = paragraph.getFormat().getLineSpacing();
//                            float firstLineIndent = paragraph.getFormat().getFirstLineIndent();
//                            templateDTO.setLineSpacing(lineSpacing);
//                            templateDTO.setIndent(firstLineIndent);
//                            templateDTO.setNameText(fontName);
//                            templateDTO.setSizeText(fontSize);
//                        }
//                        break;
//                }
//                if (paragraph.getStyleName().matches("ListParagraph") && templateDTO.getNameList() == null) {
//                    templateDTO.setNameList(fontName);
//                    templateDTO.setSizeList(fontSize);
//                }
//                int childObjectCount = paragraph.getChildObjects().getCount();
//                for (int m = 0; m < childObjectCount && templateDTO.getAlignImage() == null; m++) {
//                    DocumentObject docobj = paragraph.getChildObjects().get(m);
//                    if (docobj.getDocumentObjectType() == DocumentObjectType.Picture) {
//                        DocPicture picture = (DocPicture) docobj;
//                        Paragraph image_p = picture.getOwnerParagraph();
//                        int align = image_p.getFormat().getHorizontalAlignment().getValue();
//                        String text = section.getParagraphs().get(j + 1).getText();
//                        int alignT = section.getParagraphs().get(j + 1).getFormat().getHorizontalAlignment().getValue();
//                        TextSelection tableSelection = doc.findString(section.getParagraphs().get(j + 1), text, false, false);
//                        String tableFontName = tableSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
//                        float tableFontSize = tableSelection.getAsOneRange().getCharacterFormat().getFontSize();
//                        templateDTO.setAlignImage(align);
//                        templateDTO.setImageTSize(tableFontSize);
//                        templateDTO.setImageTName(tableFontName);
//                        templateDTO.setAlignImageT(alignT);
//                    }
//                }
//                j++;
//            }
//        }
//        return templateDTO;
//    }

//    public static TemplateDTO getAttributes(String path) {
//        Document doc = new Document();
//        doc.loadFromFile(path);
//
//        TemplateDTO templateDTO = new TemplateDTO();
//        int sectionCount = doc.getSections().getCount();
//        ExecutorService executorService = Executors.newCachedThreadPool();
//        for (int i = 0; i < sectionCount; i++) {
//            if (doc.getSections().getCount() > 1 && i == 0) {
//                i = 1;
//            }
//            Section section = doc.getSections().get(i);
//            double topMargin = section.getPageSetup().getMargins().getTop();
//            double bottomMargin = section.getPageSetup().getMargins().getBottom();
//            if (templateDTO.getPageMarginT() == null && templateDTO.getPageMarginB() == null) {
//                templateDTO.setPageMarginT(topMargin);
//                templateDTO.setPageMarginB(bottomMargin);
//            }
//            int tableCount = section.getTables().getCount();
//            if (tableCount != 0) {
//                Table table = section.getTables().get(0);
//                if (templateDTO.getHorizontalAlignTable() == null) {
//                    int align = table.getTableFormat().getHorizontalAlignment().getValue();
//                    templateDTO.setHorizontalAlignTable(align);
//                }
//            }
//            int paragraphCount = section.getParagraphs().getCount();
//            CountDownLatch countDownLatch = new CountDownLatch(100);
//            System.out.println("paragraphCount = " + paragraphCount);
//            Runnable runnable = new Runnable(){
//                @Override
//                public void run() {
//                    for (int j = 0; j < paragraphCount; j++) {
//                        Paragraph paragraph = section.getParagraphs().get(j);
//                        if (paragraph.getText().isEmpty()) {
//                            j++;
//                            countDownLatch.countDown();
//                            continue;
//                        }
//
//                        TextSelection selection = doc.findString(paragraph, paragraph.getText(), false, true);
//                        float fontSize = selection.getAsOneRange().getCharacterFormat().getFontSize();
//                        String fontName = selection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
//                        switch (paragraph.getFormat().getOutlineLevel().getValue()) {
//                            case TITLE_FIRST:
//                                if (templateDTO.getAlignHFirst() == null) {
//                                    int align1 = paragraph.getFormat().getHorizontalAlignment().getValue();
//                                    templateDTO.setAlignHFirst(align1);
//                                    templateDTO.setSizeHFirst(fontSize);
//                                    templateDTO.setNameHFirst(fontName);
//                                }
//                                break;
//                            case TITLE_SECOND:
//                                if (templateDTO.getAlignHSecond() == null) {
//                                    int align2 = paragraph.getFormat().getHorizontalAlignment().getValue();
//                                    templateDTO.setAlignHSecond(align2);
//                                    templateDTO.setSizeHSecond(fontSize);
//                                    templateDTO.setNameHSecond(fontName);
//                                }
//                                break;
//                            case TITLE_THIRD:
//                                if (templateDTO.getAlignHThird() == null) {
//                                    int align3 = paragraph.getFormat().getHorizontalAlignment().getValue();
//                                    templateDTO.setAlignHThird(align3);
//                                    templateDTO.setSizeHThird(fontSize);
//                                    templateDTO.setNameHThird(fontName);
//                                }
//                                break;
//                            case TITLE_FOURTH:
//                                if (templateDTO.getAlignHFourth() == null) {
//                                    int align4 = paragraph.getFormat().getHorizontalAlignment().getValue();
//                                    templateDTO.setAlignHFourth(align4);
//                                    templateDTO.setSizeHFourth(fontSize);
//                                    templateDTO.setNameHFourth(fontName);
//                                }
//                                break;
//                            case TEXT:
//                                if (templateDTO.getNameText() == null) {
//                                    float lineSpacing = paragraph.getFormat().getLineSpacing();
//                                    float firstLineIndent = paragraph.getFormat().getFirstLineIndent();
//                                    templateDTO.setLineSpacing(lineSpacing);
//                                    templateDTO.setIndent(firstLineIndent);
//                                    templateDTO.setNameText(fontName);
//                                    templateDTO.setSizeText(fontSize);
//                                }
//                                break;
//                        }
//                        if (paragraph.getStyleName().matches("ListParagraph") && templateDTO.getNameList() == null) {
//                            templateDTO.setNameList(fontName);
//                            templateDTO.setSizeList(fontSize);
//                        }
//                        int childObjectCount = paragraph.getChildObjects().getCount();
//                        for (int m = 0; m < childObjectCount && templateDTO.getAlignImage() == null; m++) {
//                            DocumentObject docobj = paragraph.getChildObjects().get(m);
//                            if (docobj.getDocumentObjectType() == DocumentObjectType.Picture) {
//                                DocPicture picture = (DocPicture) docobj;
//                                Paragraph image_p = picture.getOwnerParagraph();
//                                int align = image_p.getFormat().getHorizontalAlignment().getValue();
//                                String text = section.getParagraphs().get(j + 1).getText();
//                                int alignT = section.getParagraphs().get(j + 1).getFormat().getHorizontalAlignment().getValue();
//                                TextSelection tableSelection = doc.findString(section.getParagraphs().get(j + 1), text, false, false);
//                                String tableFontName = tableSelection.getAsOneRange().getCharacterFormat().getFontNameFarEast();
//                                float tableFontSize = tableSelection.getAsOneRange().getCharacterFormat().getFontSize();
//                                templateDTO.setAlignImage(align);
//                                templateDTO.setImageTSize(tableFontSize);
//                                templateDTO.setImageTName(tableFontName);
//                                templateDTO.setAlignImageT(alignT);
//                            }
//                        }
//                        System.out.println(j);
//                        countDownLatch.countDown();
//                    }
//                }
//            };
//            executorService.submit(runnable);
//            executorService.shutdown();
//            try {
//                countDownLatch.await();
//            } catch (InterruptedException e) {
//                e.printStackTrace();
//            }
//        }
//        return templateDTO;
//    }

}